Подгрузите следующие пакеты.
packages <- c('readr', 'dplyr', 'tidyr', 'ggplot2', 'fastDummies',
'rvest', 'stringr', 'naniar', 'tibble', 'Metrics', 'readr')
# install.packages(packages)
library(readr)
library(dplyr)
library(tidyr)
library(ggplot2)
library(rvest)
library(stringr)
library(naniar)
library(tibble)
library(Metrics)
library(fastDummies)
library(readr)Нужно спарсить одну страницу сайта ЦИАН. Запрос можно оставить как на картинке или сделать какой-то свой.
Парсим только первую страничку, поэтому не нужно писать никаких for. Выкачать нужно все цены, которые находятся на странице, привести их к числовому формату и найти среднее значение.
Решение:
Давайте возьмем следующий URL. Можете открыть его в браузере.
Загрузим html-страницу в R.
Найдем блок, который отвечат за цену. Видим, что это div и у него есть аттрибут class. Воспользуемся этим и напишем xpath. У нас будет 28 блоков, в которых лежат цены. Вытащим текст из этих блоков. В этих ценах есть непонятные символы и пробелы. Уберем их через str_replace_all. Можно было удалить с помощью функции str_remove_all. А теперь приведем все к числовому типу.
price <- cian %>%
html_nodes(xpath = "//div[@class='c6e8ba5398--header--1dF9r']") %>%
html_text() %>%
str_replace_all('\u20bd', '') %>%
str_replace_all(' ', '') %>%
as.numeric()Найдем просто среднее нашего массива.
## [1] 20215368
С того же ЦИАНа я спарсил для вас информацию о квартирах в районе Проспекта Вернадского (Юго-запад).
url <- 'https://raw.githubusercontent.com/ahmedushka7/R/master/docs/homeworks/exam/data/cian.csv'
data <- read_csv(url)В данном датасете наблюдением является квартира. Каждая квартира имеет следующие характеристики ( переменные):
price – цена квартиры в рублях;subway – удаленность до метро; до слэша: количество минут, после слэша: способ добраться до метро (walk – пешком, transport – обественный транспорт);rooms – количество комнат;metrs – количество квадратных метров;url – ссылка объявления на сайте ЦИАН;type – тип квартиры (first – новостройка, second – вторичка)Задания:
## Observations: 445
## Variables: 6
## $ price <dbl> 15201900, 21120000, 15291675, 25867075, 16510000, 1562275…
## $ subway <chr> "15/walk", "2/transport", "15/walk", "2/transport", "15/w…
## $ rooms <dbl> 2, 2, 2, 2, 2, 2, 2, 3, 1, 2, 3, 3, 1, 3, 2, 3, 3, 3, 1, …
## $ metrs <dbl> 50.8, 76.8, 51.1, 76.7, 50.8, 50.6, 52.0, 106.1, 50.8, 78…
## $ url <chr> "https://www.cian.ru/sale/flat/203985330/", "https://www.…
## $ type <chr> "second", "first", "second", "first", "second", "second",…
%>%).
urlsubway на две отдельные переменные.clean_data <- data %>%
mutate(price = price / 10**6) %>%
separate('subway', into = c('subway_time', 'subway_type'), sep = '/', convert = T) %>%
select(-url) %>%
mutate(metrs = as.numeric(metrs))ggplot(clean_data, aes(x = price)) +
geom_histogram(fill = 'darkblue', color = 'black', bins = 25) +
labs(title = 'Распределение цен на квартиры в районе Проспект Вернадского',
x = 'Цена (в миллионах рублей)',
y = 'Количество')ggplot(clean_data, aes(x = price, fill = factor(rooms))) +
geom_histogram(color = 'black', bins = 25) +
labs(title = 'Распределение цен на квартиры в районе Проспект Вернадского',
x = 'Цена (в миллионах рублей)',
y = 'Количество',
fill = 'Количество комнат')## # A tibble: 3 x 2
## rooms price
## <dbl> <dbl>
## 1 1 11.8
## 2 2 17.3
## 3 3 28.6
## # A tibble: 2 x 2
## type n
## <chr> <int>
## 1 first 11
## 2 second 434
У вас есть два набора данных train и test. Вам нужно попробовать построить наилучшую модель для прогнозирования цены квартиры (price). Метрикой качества будет MAPE. Помните, что эта метрика качества несимметрична.
url_train <- 'https://raw.githubusercontent.com/ahmedushka7/R/master/docs/homeworks/exam/data/train.csv'
url_test <- 'https://raw.githubusercontent.com/ahmedushka7/R/master/docs/homeworks/exam/data/test.csv'
train <- read_csv(url_train)
test <- read_csv(url_test)Если в качестве признака вы взяли площадь квартиры (квадратные метры), то проинтепретируйте коэффициент перед ним. А также нарисуйте график зависимости таргета от площади квартиры.
Решение:
1.
Очевидным кажется зависимость цены от площади квартиры. Попробуем нарисовать график.
Зависимость есть. Попробуем построить обычную парную регрессию.
model1 <- lm(price ~ metrs, data = train)
pred1_train <- predict(model1, train)
mape(predicted = pred1_train, actual = train$price)## [1] 0.1456997
## [1] 0.150459
2.
Попробуем добавить категориальную переменную: количество комнат.
train <- dummy_cols(train, select_columns = 'rooms')
test <- dummy_cols(test, select_columns = 'rooms')
model2 <- lm(price ~ metrs + rooms_1 + rooms_2 + rooms_3 - 1, data = train)
pred2_train <- predict(model2, train)
mape(predicted = pred2_train, actual = train$price)## [1] 0.1206979
## [1] 0.1417496
ggplot(train, aes(metrs, price, color = factor(rooms))) +
geom_point() +
geom_smooth(se = F, method = 'lm')3.
Попробуем выкинуть выбросы.
train <- train %>% filter(price < 70)
model3 <- lm(price ~ metrs + rooms_1 + rooms_2 + rooms_3 - 1, data = train)
pred3_train <- predict(model3, train)
mape(predicted = pred3_train, actual = train$price)## [1] 0.1133634
## [1] 0.1329036
ggplot(train, aes(metrs, price, color = factor(rooms))) +
geom_point() +
geom_smooth(se = F, method = 'lm')Можно попробовать сделать еще что-то, но этого достаточно для полного балла.